<?php

namespace app\common\service;

class DouBaoAiWordService extends ApiService
{
    private $apiKey;
    private $endpointId;
    private $apiUrl;

    public function __construct()
    {
        $this->apiKey = env('DOUBAO.DOUBAO_1_5_PRO_32_API_KEY', '');
        $this->endpointId = env('DOUBAO.DEEPSEEK_3_1_ENDPOINT_ID', '');
        $this->apiUrl = 'https://ark.cn-beijing.volces.com/api/v3/chat/completions';
    }

    public function getWord($word)
    {
        // 使用单引号避免变量解析问题，并优化内容结构
        $content = <<<EOT
你的任务是根据给定的英语单词生成特定的内容，并按照指定的JSON结构输出。以下是需要处理的英语单词是：({$word})
### 具体任务及要求
#### 翻译生成
1. 根据单词生成对应的翻译，需要携带词性，例如 `n.用铅笔写`。
#### 音标生成
1. 根据单词生成英式音标，音标必须用//包裹。
#### 元辅音拆分
1. 明确音标中的元音和辅音音素。
2. 根据音标中的元音和辅音音素，将单词拆分为元音字母组合和辅音字母组合，使其与音标对应。
#### 音节拆分
1. 识别音标中的元音音素，因为一个音节通常包含一个元音音素。
2. 根据元音音素将音标划分为不同的音节。
3. 按照音节划分的结果，对单词进行相应的音节拆分。
#### 英文例句生成
1. 生成三个带有该单词的英文例句，要求简单易懂，句子结尾有英语句号，不超过10个单词且最低5个单词，并且有对应的中文翻译。
#### 其他规则
1. 分解英语单词，如果是词组或组合词按单个单词拆分（该规则不应用于英文例句生成）。
#### 输出要求
最终结果，严格按照JSON格式输出：
{
    "zh": "翻译",
    "phonetic": "音标",
    "examples": [
        {
            "en": "英文例句",
            "zh": "英文例句对应中文翻译"
        }
    ],
    "syllables": [
        {
            "item": "元辅音拆分的元素",
            "type": "元素对应的类型 1 元音 2 辅音",
            "pronounce": "元素对应的音标"
        }
    ],
    "spells": [
        {
            "item": "音节拆分的元素",
            "pronounce": "音节拆分元素对应的音标"
        }
    ]
}
#### JSON结构字段说明
"zh"："翻译"
"phonetic": "音标"
"examples->en": "示例-英文例句"
"examples->zh": "示例-中文翻译"
"syllables->item": "元辅音拆分元素"
"syllables->type": "元辅音拆分元素对应的类型 1 元音 2 辅音"
"syllables->pronounce": "元素对应的音标"
"spells->item": "音节拆分的元素"
"spells->pronounce": "音节拆分元素对应的音标"
EOT;

        $authToken = 'Bearer ' . $this->apiKey;

        $payload = [
            'model' => $this->endpointId,
            'messages' => [
                ['role' => 'user', 'content' => $content]
            ]
        ];

        $response = HttpService::postJson(
            $this->apiUrl,
            $payload,
            ['Authorization: ' . $authToken]
        );
        if (!$response) {
            logSave([
                'word' => $word,
                'msg' => 'DouBao API Error: 无效响应'
            ], 'getWord', 'douBaoAiWordService');
            throw new \Exception('无效响应');
        }

        $jsonData = json_decode($response, true);

        // 增强错误处理
        if (isset($jsonData['status']) && $jsonData['status'] == false) {
            logSave([
                'word' => $word,
                'msg' => 'DouBao API Error: 响应超时'
            ], 'getWord', 'douBaoAiWordService');
            throw new \Exception('响应超时');
        }

        if (isset($jsonData['error'])) {
            logSave([
                'word' => $word,
                'error' => $jsonData['error'],
                'msg' => 'DouBao API Error: 单词文章生成失败'
            ], 'getWord', 'douBaoAiWordService');
            throw new \Exception('单词文章生成失败: ' . ($jsonData['error']['message'] ?? '未知错误'));
        }

        if (!isset($jsonData['choices'][0]['message']['content'])) {
            logSave([
                'word' => $word,
                'msg' => 'DouBao API Error: 无效响应格式',
                'response' => $jsonData
            ], 'getWord', 'douBaoAiWordService');
            throw new \Exception('API返回格式错误');
        }

        $reasoning_content = $jsonData['choices'][0]['message']['content'];
        $reasoning_content = ltrim($reasoning_content, '```json');
        $reasoning_content = rtrim($reasoning_content, '```');

        logSave([
            'word' => $word,
            'result' => $reasoning_content,
            'msg' => '响应结果'
        ], 'getWord', 'douBaoAiWordService');

        $result = json_decode($reasoning_content, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
            logSave([
                'word' => $word,
                'content' => $reasoning_content,
                'error' => json_last_error_msg()
            ], 'getWord', 'douBaoAiWordService');
            throw new \Exception('JSON解析失败: ' . json_last_error_msg());
        }
        return $result;
    }
}
